iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
DevOps

SRE/K8S 碎碎念系列 第 8

[2023-08][Cost Down] 在不必要的時間關閉 Node

  • 分享至 

  • xImage
  •  

這次的任務是為專案省成本,根據 AWS 官方建議,其中之一就是 Down scaling,也就是在閒暇時間將機器關閉。我們專案剛好有 dev,stage,beta,prod 四個環境,且開發並沒有如此頻繁,dev,stage等環境一般時間開著也是燒錢,不如就來想辦法”自動化”關掉它們!

如果你是 EC2-based 的架構,你可以很快速的使用 Scheduled Scaling for Auto Scaling Groups

但如果你是 EKS,相較於 EC2 一次只跑一個 setup,EKS 上一個 ec2 會跑多個 container,也就是説直接開關並不是一個可行的方式,因為以下原因

  • 她會隨機關閉 applications,當多個applications 共用同一個EC2 時,若直接關閉該EC2,可能會導致無法預測哪個applications 關閉,進而影響到整個系統的穩定性和可用性
  • 當應用程序的某個節點(Pod)出現問題或失效時,管理 Pod 的控制器 (例如 Deployment) 會將失效的 Pod 重新調度到其他可用節點上,以確保應用程序持續運行,在 Kubernetes 中,控制器如 Deployment 負責管理應用程序的生命周期。Deployment 可以確保在集群中始終保持所需數量的 Pod 副本。如果某個 Pod 失效,Deployment 控制器會自動重新創建一個新的 Pod 來替換它,並將其調度到其他可用節點以繼續提供服務。這樣可以確保在節點出現問題時,不會導致整個應用程序停止運行
  • A cluster-autoscaler will spin up new EC2 instances to meet the demand
  • cluster-autoscaler 將會自動創建(spin up)新的 EC2 來滿足原有需求

因此,我們會藉由調整 MNG 的 ASG 來達到需求

Node group

eksctl get nodegroup --cluster my-eks 
CLUSTER NODEGROUP                               STATUS  CREATED                 MIN SIZEMAX SIZE        DESIRED CAPACITY        INSTANCE TYPE   IMAGE ID        ASG NAME       TYPE
my-eks  general-2023092014043003710000000a      ACTIVE  2023-09-20T14:04:33Z    1      10               1          t3.small        AL2_x86_64      eks-general-2023092014043003710000000a-06c55974-0d19-b192-0640-bc9ae7f7868d    managed
my-eks  spot-2023092014043003760000000c         ACTIVE  2023-09-20T14:04:34Z    1      10               1          t3.micro        AL2_x86_64      eks-spot-2023092014043003760000000c-cac55974-0d35-8a03-eb66-5bc3160c9311    managed

一般狀況下, cluster autoscaler 不會發現 ASG 沒被管理的 node groups。所以你必須新增 tags 到 AGS 來檢測 ASG 及部署 cluster autoscaler

export ASG_NAME=$(aws autoscaling describe-auto-scaling-groups --query "AutoScalingGroups[? Tags[? (Key=='kubernetes.io/cluster/my-eks') &&  
Value=='owned']].[AutoScalingGroupName]")

Screenshot 2023-09-21 at 4.21.11 PM.png

Screenshot 2023-09-21 at 4.20.42 PM.png

Screenshot 2023-09-21 at 4.20.47 PM.png

為此 asg 加上 tag

aws autoscaling create-or-update-tags \ 
  --tags                                               
ResourceId=${ASG_NAME},ResourceType=auto-scaling-group,                            
Key=k8s.io/cluster-autoscaler/scale-to-from-zero,Value=owned,PropagateAtLaunch=true

aws autoscaling create-or-update-tags \
  --tags 
ResourceId=${ASG_NAME},ResourceType=auto-scaling-group,
Key=k8s.io/cluster-autoscaler/enabled,Value=true,PropagateAtLaunch=true
eksctl scale nodegroup --cluster=<clusterName> --nodes=<desiredCount> 
--name=<nodegroupName> [ --nodes-min=<0> ] [ --nodes-max=<1> ]

eksctl scale nodegroup --cluster=my-eks --nodes=0 --name=<nodegroupName>

#!/bin/bash

# 藉由 eksctl 獲取 JSON 格式的 Nodegroup Name
NODEGROUP_NAME=$(eksctl get nodegroup --cluster my-eks -o json)

# 將 formatted_NG_NAME 轉換成 list
formatted_NG_NAME=()
while IFS= read -r line; do
    formatted_NG_NAME+=("$line")
done <<< "$formatted_NG_NAME_str"

# 遍尋 formatted_ASG_NAME list,並執行 MNG ASG 設定
for NODEGROUP in $formatted_NG_NAME; do
		echo $NODEGROUP
		eksctl scale nodegroup --cluster=my-eks --name="$NODEGROUP" --nodes-min=0 --nodes=0
    eksctl scale nodegroup --cluster=my-eks --nodes=0 --name="$NODEGROUP"
done

###############

#!/bin/bash

# 藉由 eksctl 獲取 JSON 格式的 Nodegroup Name
NODEGROUP_NAME=$(eksctl get nodegroup --cluster my-eks -o json)

# 將 formatted_NG_NAME 轉換成 list
formatted_NG_NAME=()
while IFS= read -r line; do
    formatted_NG_NAME+=("$line")
done <<< "$formatted_NG_NAME_str"

# 遍尋 formatted_ASG_NAME list,並執行 MNG ASG 設定
for NODEGROUP in $formatted_NG_NAME; do
		echo $NODEGROUP
		eksctl scale nodegroup --cluster=my-eks --name="$NODEGROUP" --nodes-min=0 --nodes=1
    eksctl scale nodegroup --cluster=my-eks --nodes=1 --name="$NODEGROUP"
done

上一篇
[2023-07] PDB
下一篇
[2023-09][Upgrade] 升級 1.25 時的 PSP 與 KSM
系列文
SRE/K8S 碎碎念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言